package com.spcloud.service.controller;

import com.alibaba.fastjson.JSON;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.spcloud.service.MessageBinder;
import com.spcloud.service.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author GuoChunbo
 * @create 2020-02-20 15:13
 * @Description: 类的描述
 */
@RestController
public class UserController {

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    MessageBinder messageBinder;

//    @Autowired
//    JmsTemplate jmsTemplate;

    /**
     * info
     */
    @GetMapping("/info")
    public String info(){
        return "User Info";
    }


    /**
     * 注册
     * reg
     */
    @GetMapping("/reg")
    public String reg(User user){

        //先保存数据库
        user.setId((int)(Math.random() * 1000));

        //调用接口方法发送消息 必须是json类型消息
        messageBinder.regUserChannel().send(MessageBuilder.withPayload(JSON.toJSONString(user)).build());

        //发送消息通知发短信或者发邮件
//        jmsTemplate.convertAndSend("user_reg","username");
        return "success";
    }

    /**
     * 服务调用
     * 断路器保护服务失败执行的方法
     * orderInfo
     */
    @HystrixCommand(fallbackMethod = "fallOrderInfo")
    @GetMapping("/orderInfo")
    public String orderInfo(){
        //如果成功
        String str = restTemplate.getForObject("http://service-order/info",String.class);
        return str;
    }

    /**
     * 失败后的回调函数
     * @return
     */
    public String fallOrderInfo(){
        //服务调用失败后的业务逻辑
        //默认返回
        return "User - Order Info";
    }
}
